package com.zxjbyte.yiyi.framework.web.config;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.ArrayList;
import java.util.List;

/**
 * Web 层全局配置属性
 * <p>
 * 用于配置全局通用的过滤器、请求包装器、异常日志等功能。
 * 该配置类会绑定 application.yml 或 yiy-default.properties 中以 {@link #WEB_PROP_PREFIX} 为前缀的属性。
 * </p>
 *
 * @author zhangxingjia
 * @date 2023/3/8
 * @version 1.1
 */
@Getter
@Setter
@ConfigurationProperties(YiyiWebProperties.WEB_PROP_PREFIX)
public class YiyiWebProperties {

    public static final String WEB_PROP_PREFIX = "yiyi.web";

    /**
     * 全局通用排除路径
     * <p>
     * 过滤器在处理请求时，如果请求 URI 匹配该列表中的路径，将被自动跳过。
     * 支持 Ant 风格路径，例如：/actuator/**、/swagger-ui/**。
     * </p>
     */
    private List<String> excludePaths = new ArrayList<>();

    /**
     * 请求包装过滤器配置
     * <p>
     * 用于控制是否启用请求包装器 Filter（YiyiRequestWrapperFilter），
     * 使请求体可以被多次读取。
     * </p>
     */
    private RequestWrapper requestWrapper = new RequestWrapper();

    /**
     * 异常日志相关配置
     * <p>
     * 控制全局异常日志记录功能的开关。
     * </p>
     */
    private ErrorLog errorLog = new ErrorLog();

    // -----------------------------------------------------------
    // 内部静态类：异常日志配置
    // -----------------------------------------------------------

    @Getter
    @Setter
    public static class ErrorLog {

        /**
         * 是否启用全局异常日志记录
         * <p>
         * 默认为 true，开启时系统会记录所有未捕获异常的日志。
         * 可根据环境或业务需求关闭。
         * </p>
         */
        private Boolean enabled = true;
    }

    // -----------------------------------------------------------
    // 内部静态类：请求包装过滤器配置
    // -----------------------------------------------------------

    @Getter
    @Setter
    public static class RequestWrapper {

        /**
         * 是否启用请求包装过滤器
         * <p>
         * 启用后，YiyiRequestWrapperFilter 会包装 HttpServletRequest，
         * 允许重复读取请求体 InputStream。
         * 仅对 POST、PUT、PATCH、DELETE 等带请求体的方法生效。
         * </p>
         */
        private Boolean enabled = true;
    }
}
